/**
 * @Description: 数组对象去重
 * @Version: 1.0
 * @Author: 琴时
 * @Date: 2021-11-05 15:31:23
 * @LastEditors: 琴时
 * @LastEditTime: 2023-01-04 11:46:37
 * @FilePath: \pt-utils\src\utils_array\数组对象去重.js
 */
/*******
 * @description: 数组对象去重
 * @author: 琴时
 * @param {dataSource} 原数组对象
 * @param {primaryKey} 指定数组对象元素主键(以该主键的值为标准判断数据是否重复)==>如果数组元素是一般数据类型，不传primaryKey
 * @return {array} 去重后的新数组对象
 */
export const deWeightArray = (dataSource, primaryKey, callback) => {
  /* 如果数组的元素是基本数据类型那就不传第二个参数 */
  if (!primaryKey) {
    const set = new Set(dataSource)
    return [...set]
  }
  const tempList = []
  const map = new Map() //创建Map对象数据结构
  // 遍历需要去重的数组对象
  dataSource.forEach(item => {
    // 判断map对象中该key是否已经存在
    if (!map.has(item[primaryKey])) {
      map.set(item[primaryKey], item) //如果不存在，将该数据插入
    } else {
      tempList.push(item)
    }
  })
  callback && callback(tempList)
  return [...map.values()] //将map对象转换回数组再返回
}

/**
 * 测试用例
 * 将src/index.js底部执行函数:selectTest(params)的实参params改为 5
 * 直接无法测试，请使用npm run dev或者去掉 export 使用node运行当前界面测试即可
 */
const list1 = [
  { id: 1, name: 'a' },
  { id: 1, name: 'a' },
  { id: 2, name: 'b' },
  { id: 2, name: 'b' },
  { id: 3, name: 'c' },
  { id: 3, name: 'c' },
]
const list2 = [1, 1, 2, 2, 3, 3, null, undefined, undefined, null, '', '']
console.log('测试数组对象去重:', deWeightArray(list1, 'id')) //测试数组对象去重: [ { id: 1, name: 'a' }, { id: 2, name: 'b' }, { id: 3, name: 'c' } ]
console.log('测试数组元素一般数据类型去重:', deWeightArray(list2)) //测试数组元素一般数据类型去重: [ 1, 2, 3, null, undefined, '' ]
